package br.nextfm.dao;

import java.util.List;

import javax.persistence.Query;

import br.nextfm.model.Administrador;
import br.nextfm.model.Comum;
import br.nextfm.model.Usuario;

public class UsuarioDao extends Dao {
	
	public boolean insert(Usuario usuario) {

		try {

			getManager().getTransaction().begin();
			getManager().persist(usuario);
			getManager().getTransaction().commit();

			return true;

		} 

		catch (Exception e) {

			e.printStackTrace();

			return false;
		}
		
	}
	
	public boolean update(Usuario usuario) {
		
		try {

			getManager().getTransaction().begin();
			getManager().merge(usuario);
			getManager().getTransaction().commit();

			return true;

		} 

		catch (Exception e) {

			e.printStackTrace();

			return false;
		}
		
	}
	
	public boolean deleteComum(int id) {
		
		try {

			getManager().getTransaction().begin();
			Usuario usuario = getManager().find(Comum.class, id);
			getManager().remove(usuario);
			getManager().getTransaction().commit();

			return true;

		} 

		catch (Exception e) {

			e.printStackTrace();

			return false;
		}
		
	}
	
	public boolean deleteAdministrador(int id) {
		
		try {

			getManager().getTransaction().begin();
			Usuario usuario = getManager().find(Administrador.class, id);
			getManager().remove(usuario);
			getManager().getTransaction().commit();

			return true;

		} 

		catch (Exception e) {

			e.printStackTrace();

			return false;
		}
		
	}
	
	public Usuario getUsuarioByLogin(String login, String senha) {
	
		try {

			 Query query = getManager().createQuery("SELECT u FROM Usuario u WHERE u.login LIKE \"" + login + "\" AND u.senha LIKE \"" + senha + "\"");
			 
			 return (Usuario) query.getSingleResult();
			 
		} 
		
		catch (Exception e) {
			
			e.printStackTrace();
			
			return null;
			
		}
	
	}
	
	public Administrador getAdministradorByLogin(String login, String senha, String pin) {
		
		Administrador administrador = (Administrador) getUsuarioByLogin(login, senha);
		
		try {
			
			Query query = getManager().createQuery("SELECT a FROM Administrador a WHERE a.id LIKE \"" + administrador.getId() + "\" AND a.pin LIKE \"" + pin + "\"");
			 
			return (Administrador) query.getSingleResult();
			
		}
		
		catch (Exception e) {
			
			e.printStackTrace();
			
			return null;
			
		}
		
	}
	
	public Administrador getAdministrador(int id) {

		try {

			return getManager().find(Administrador.class, id);

		} 

		catch (Exception e) {

			e.printStackTrace();

			return null;

		}
		
	}
	
	public Comum getComum(int id) {

		try {

			return getManager().find(Comum.class, id);

		} 

		catch (Exception e) {

			e.printStackTrace();

			return null;

		}
		
	}
	
	@SuppressWarnings("unchecked")
	public List<Usuario> getAll() {
		
		try {

			Query query = getManager().createQuery("SELECT u FROM Usuario u ORDER BY u.nome");

			return query.getResultList();

		}

		catch (Exception e) {

			e.printStackTrace();

			return null;

		}
		
	}
	
	@SuppressWarnings("unchecked")
	public List<Administrador> getAllAdministradores() {
		
		try {

			Query query = getManager().createQuery("SELECT a FROM Administrador a ORDER BY a.nome");

			return query.getResultList();

		}

		catch (Exception e) {

			e.printStackTrace();

			return null;

		}
		
	}
	
	@SuppressWarnings("unchecked")
	public List<Comum> getAllComuns() {
		
		try {

			Query query = getManager().createQuery("SELECT c FROM Comum c ORDER BY c.nome");

			return query.getResultList();

		}

		catch (Exception e) {

			e.printStackTrace();

			return null;

		}
		
	}

}
